/**
 * 应用程序的所有类型定义
 * Vue3 + TypeScript 级联选择器表格联动应用
 */

// 级联选项接口
export interface CascaderOption {
  /** 选项的唯一名称 */
  name: string
  /** 中文显示名称 */
  nameCn: string
  /** 英文显示名称 */
  nameEn: string
  /** 子选项数组 */
  children?: CascaderOption[]
}

// 表格数据项接口
export interface TableDataItem {
  /** 数据ID */
  id: number
  /** 数据名称 */
  name: string
  /** 数据分类 */
  category: string
  /** 数据描述 */
  description: string
  /** 创建时间 */
  createTime: string
  /** 状态码 */
  status: 'active' | 'inactive' | 'pending'
  /** 状态文本 */
  statusText: string
  /** 其他扩展字段 */
  [key: string]: any
}

// API响应接口
export interface ApiResponse<T = any> {
  /** 请求是否成功 */
  success: boolean
  /** 响应数据 */
  data: T
  /** 响应消息 */
  message?: string
  /** 数据总数 */
  total?: number
  /** 错误代码 */
  errorCode?: string
}

// 请求信息接口
export interface RequestInfo {
  /** 请求URL */
  url: string
  /** 请求方法 */
  method: 'GET' | 'POST' | 'PUT' | 'DELETE'
  /** 请求参数 */
  params: Record<string, any>
  /** 请求状态 */
  status: 'loading' | 'success' | 'error'
}

// 操作日志接口
export interface OperationLog {
  /** 日志ID */
  id: string
  /** 日志时间 */
  time: string
  /** 日志消息 */
  message: string
  /** 日志类型 */
  type: 'info' | 'success' | 'warning' | 'error'
  /** 日志详情 */
  details?: any
}

// 筛选器变更事件数据
export interface FilterChangeEvent {
  /** 选中的值数组 */
  value: string[]
  /** 选中的选项对象数组 */
  selectedOptions: CascaderOption[]
  /** 请求参数值（最深层级） */
  requestParam: string
}

// 表格列配置接口
export interface TableColumn {
  /** 列键名 */
  key: string
  /** 列标题 */
  title: string
  /** 列宽度 */
  width?: string | number
  /** 是否可排序 */
  sortable?: boolean
  /** 自定义渲染函数 */
  render?: (value: any, record: TableDataItem) => string
}

// 分页配置接口
export interface PaginationConfig {
  /** 当前页码 */
  current: number
  /** 每页条数 */
  pageSize: number
  /** 数据总数 */
  total: number
  /** 显示快速跳转 */
  showQuickJumper?: boolean
  /** 显示每页条数选择器 */
  showSizeChanger?: boolean
}

// 组件Props类型
export interface FilterSectionProps {
  /** 级联选择器选项 */
  options: CascaderOption[]
  /** 当前选中值 */
  selectedValue: string[]
  /** 是否加载中 */
  loading: boolean
}

export interface DataTableSectionProps {
  /** 表格数据 */
  tableData: TableDataItem[]
  /** 是否加载中 */
  loading: boolean
  /** 请求信息 */
  requestInfo: RequestInfo
}

export interface LogSectionProps {
  /** 操作日志数组 */
  logs: OperationLog[]
}

// 组件Emits类型
export interface FilterSectionEmits {
  /** 筛选条件变更事件 */
  (event: 'filter-change', value: string[], selectedOptions: CascaderOption[]): void
  /** 更新选中值 */
  (event: 'update:selectedValue', value: string[]): void
}

export interface DataTableSectionEmits {
  /** 刷新数据事件 */
  (event: 'refresh'): void
  /** 分页变更事件 */
  (event: 'page-change', page: number, pageSize: number): void
}

export interface LogSectionEmits {
  /** 清空日志事件 */
  (event: 'clear-logs'): void
}

// 工具函数类型
export type DeepReadonly<T> = {
  readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P]
}

export type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>

export type RequiredFields<T, K extends keyof T> = T & Required<Pick<T, K>>

// API请求函数类型
export type ApiRequestFunction<T = any> = (params: Record<string, any>) => Promise<ApiResponse<T>>

// 错误处理类型
export interface AppError extends Error {
  code?: string
  details?: any
}

// 配置选项类型
export interface AppConfig {
  /** API基础URL */
  apiBaseUrl: string
  /** 请求超时时间 */
  timeout: number
  /** 是否开启调试模式 */
  debug: boolean
  /** 分页默认配置 */
  pagination: {
    defaultPageSize: number
    pageSizes: number[]
  }
}

// 状态管理类型
export interface AppState {
  /** 当前选中的级联值 */
  selectedCascaderValue: string[]
  /** 当前表格数据 */
  tableData: TableDataItem[]
  /** 加载状态 */
  loading: boolean
  /** 错误信息 */
  error: AppError | null
}

// 全局常量类型
export const APP_CONSTANTS = {
  /** 最大日志条数 */
  MAX_LOG_COUNT: 100,
  /** API请求超时时间 */
  API_TIMEOUT: 30000,
  /** 防抖延迟时间 */
  DEBOUNCE_DELAY: 300
} as const

export type AppConstants = typeof APP_CONSTANTS

// 导出所有类型的联合类型（用于类型检查）
export type AllAppTypes = 
  | CascaderOption
  | TableDataItem
  | ApiResponse
  | RequestInfo
  | OperationLog
  | FilterChangeEvent
  | TableColumn
  | PaginationConfig
  | AppError
  | AppConfig
  | AppState
